package br.com.toscano.contpedido.view.converter;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.Locale;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

import br.com.toscano.contpedido.util.Util;

@FacesConverter(value = "bigDecimalConversor")
public class BigDecimalConversor implements Converter {

	private static final int ESCALA = 2;
	private static final String COMPONENT_ATTRIBUTE_MSG_KEY = "msgKey";
	private static final String PONTO = ".";
	private static final String VIRGULA = ",";
	private static final Locale LOCALE_PT_BR = new Locale("pt", "BR");
	private static final String STRING_VAZIA = "";
	private static final int UM = 1;
	private static final int ZERO = 0;
	private static final String DECIMAL_FORMAT_FAIXA_VALOR = "#,##0.00";

	public Object getAsObject(FacesContext context, UIComponent component, String string) {

		BigDecimal vl = null;

//		if (string.indexOf(".") != -1 && (string.indexOf(".") == string.length() - 3 || string.indexOf(".") == string.length() - 2 )) {
			string = string.replace('.',',');
//		}
		
		try {
			int escala = ESCALA;
			String vlMinTruncado = this.truncarValorAposVirgula(string, escala + UM);

			int posVirgula = vlMinTruncado.indexOf(VIRGULA) + UM;

			if (posVirgula > ZERO) {
				int tamanhoParteDecimal = vlMinTruncado.length() - posVirgula;

				if (tamanhoParteDecimal < escala) {
					escala = tamanhoParteDecimal;
				}
			} else {
				escala = ZERO;
			}

			if (vlMinTruncado != null && !vlMinTruncado.equals(STRING_VAZIA)) {
				BigInteger bi = new BigInteger(vlMinTruncado.replace(VIRGULA, STRING_VAZIA)
						.replace(PONTO, STRING_VAZIA));
				vl = new BigDecimal(bi, escala);
			}

		} catch (NumberFormatException e) {
			//throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, FibraMessageService.getInstance().getMessage(getComponentAttributeMsgKey(component)).getLabel(), ""));
			return null;
		}

		return vl;
	}

	public String getAsString(FacesContext context, UIComponent component, Object value) {
		String formatPattern = DECIMAL_FORMAT_FAIXA_VALOR;
		NumberFormat formatador = new DecimalFormat(formatPattern, new DecimalFormatSymbols(LOCALE_PT_BR));

		return value != null ? formatador.format(value) : "";
	}

	/**
	 * Metodo para recuperar uma msgKey informada atraves de um atributo do componente JSF.
	 * 
	 * @return
	 */
	protected String getComponentAttributeMsgKey(UIComponent component) {
		String retorno = null;

		// recupera o atributo do componente que representa a chave da mensagem
		Object o = component.getAttributes().get(COMPONENT_ATTRIBUTE_MSG_KEY);

		// se for uma instancia de String...
		if (o instanceof String) {
			retorno = (String) o;
		}
		return retorno;
	}

	/**
	 * Trunca o valor após a vírgula
	 * 
	 * @return
	 */
	public String truncarValorAposVirgula(String vl, int qtde) {

		String ret = vl;

		if (vl.contains(VIRGULA)) {
			// Se o tamanho da string for menor que a soma do deslocamento
			if (vl.length() < vl.indexOf(VIRGULA) + qtde) {
				ret = vl.substring(ZERO, vl.length());
			} else {
				ret = vl.substring(ZERO, vl.indexOf(VIRGULA) + qtde);
			}
		}
		return ret;
	}
}